package com.wu.movingcount;

import java.util.Arrays;

/**
 * 机器人的运动范围
 * 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动，
 * 每一次只能向左，右，上，下四个方向移动一格，但是不能进入行坐标和列坐标的数位之和大于k的格子。
 * 例如，当k为18时，机器人能够进入方格（35,37），因为3+5+3+7 = 18。但是，它不能进入方格（35,38），
 * 因为3+5+3+8 = 19。请问该机器人能够达到多少个格子？
 */
public class Solution {
    private int res;
    public int movingCount(int threshold, int rows, int cols) {
        if (threshold < 0 || rows < 0 || cols < 0) {
            return 0;
        }
        res = 0;
        boolean[][] vistited = new boolean[rows][cols];
        move(0, 0, rows, cols, threshold, vistited);
        return res;
    }

    private int cal(int x, int y) {
        int sum = 0;
        while (x != 0) {
            sum += x % 10;
            x /= 10;
        }
        while (y != 0) {
            sum += y % 10;
            y /= 10;
        }
        return sum;
    }

    private void move(int x, int y, int rows, int cols, int threshold, boolean[][] vistited) {
        if (x < 0 || x >= rows || y < 0 || y >= cols || vistited[x][y] || cal(x, y) > threshold) {
            return;
        }
        vistited[x][y] = true;
        res++;
        move(x + 1, y, rows, cols, threshold, vistited);
        move(x - 1, y, rows, cols, threshold, vistited);
        move(x, y + 1, rows, cols, threshold, vistited);
        move(x, y - 1, rows, cols, threshold, vistited);
    }
}